<?php
/**
 * 调度器核心类
 * 
 * @author Yucy<yucy1985@gmail.com>
 */
class YucyDispatcher
{	
	/**
	 * 
	 * 模块名称
	 * @var string
	 */
	protected $moduleName;
	
	/**
	 * 
	 * 控制器名称
	 * @var string
	 */
	protected $controllerName;
	
	/**
	 * 
	 * 操作名称
	 * @var string
	 */
	protected $actionName;

	/**
	 * 
	 * 控制器对象
	 * @var object
	 */
	protected $controller;
	

	/**
	 * 
	 * 实例化调度器
	 */
	public function __construct() {}


	/**
	 * 
	 * 运行调度器
	 */
	public function run()
	{
		// 执行调度
		$this->dispatch();
		// 运行控制器
		$this->getController()->run();
        
        return ;
	}
	
	
	/**
	 * 
	 * 执行调度
	 */
	protected function dispatch() {}
	
	
	/**
	 * 
	 * 加载控制器文件
	 */
	protected function loadControllerFile() {}
	
	
	/**
	 * 
	 * 获取控制器对象
	 * @return object
	 */
	public function getController()
	{
		if ($this->controller) return $this->controller;
		
		// 加载控制器类文件
		$this->loadControllerFile();

		// 控制器类名称
		$class_name = $this->getControllerName() . YucyConfig::get('controller_suffix');
		
		if (!class_exists($class_name)) throw new YucyException("您指定的控制器类{$class_name}不存在", 21);
		$this->controller = new $class_name;
		
		return $this->controller;
	}
	
	
	/**
	 * 
	 * 获得模块名称
	 * @return string
	 */
	public function getModuleName()
	{
		if ($this->moduleName) return $this->moduleName;
		
		$this->setModuleName(YucyConfig::get('module_default_name'));
		
		return $this->moduleName;
	}
	
	
	/**
	 *
	 * 设置模块名
	 * @param string $name
	 * @return object;
	 */
	public function setModuleName($name)
	{
		$this->moduleName = (string)$name;
		
		return $this;
	}
	
	
	/**
	 *
	 * 获取控制器名称
	 * @return string
	 */
	public function getControllerName() 
	{
		if ($this->controllerName) return $this->controllerName;
		
		$this->setControllerName(YucyConfig::get('controller_default_name'));
		
		return $this->controllerName;
	}
	
	
	/**
	 *
	 * 设置控制器名
	 * @param string $name
	 * @return object;
	 */
	public function setControllerName($name)
	{
		$this->controllerName = (string)$name;
		
		return $this;
	}
	
	
	/**
	 *
	 * 获取操作名称
	 * @return string
	 */
	public function getActionName()
	{
		if ($this->actionName) return $this->actionName;
		
		$this->setActionName(YucyConfig::get('action_default_name'));
		
		return $this->actionName;
	}
	
	
	/**
	 * 
	 * 设置操作名
	 * @param string $name
	 * @return object;
	 */
	public function setActionName($name)
	{
		$this->actionName = (string)$name;
		
		return $this;
	}
}
?>